#pragma once

#include <iostream>
#include "Protocol.hpp"

class Calculator
{
public:
    Calculator()
    {
    }

    Response Execute(const Request &req)
    {
        Response resp;
        switch (req.Oper())
        {
        case '+':
            resp.SetResult(req.X() + req.Y());
            break;
        case '-':
            resp.SetResult(req.X() - req.Y());
            break;
        case '*':
            resp.SetResult(req.X() * req.Y());
            break;
        case '/':
        {
            if (req.Y() == 0)
            {
                resp.SetCode(1);
            }
            else
            {
                resp.SetResult(req.X() / req.Y());
            }
        }
        break;
        case '%':
        {
            if (req.Y() == 0)
            {
                resp.SetCode(2);
            }
            else
            {
                resp.SetResult(req.X() % req.Y());
            }
        }
        break;
        default:
            resp.SetCode(3);
            break;
        }
        return resp;
    }

    ~Calculator()
    {
    }
}cal;

std::string HandlerRequest(std::string& inbuffer)
{
    std::string request_str;
    std::string result_str;
    while (Decode(inbuffer, &request_str))
    {
        std::string resp_str;
        if (request_str.empty()) break;
        // 一定拿到了一个完整的报文
        // 1.反序列化
        Request req;
        if (!req.Deserialize(request_str)) break;
        std::cout << request_str << std::endl;
        std::cout << "----------------------------" << std::endl;
        req.Print();
        std::cout << "----------------------------" << std::endl;
        // 2.业务处理
        Response resp = cal.Execute(req);
        // 3.序列化
        resp.Serialize(resp_str);
        // 4.添加长度字段
        Encode(resp_str);
        // 5.拼接应答
        result_str = resp_str;
    }
    return result_str.empty() ? std::string() : result_str;
}